package com.msb.crm.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.msb.crm.base.BaseService;
import com.msb.crm.dao.SaleChanceMapper;
import com.msb.crm.enums.DevResult;
import com.msb.crm.enums.StateStatus;
import com.msb.crm.query.SaleChanceQuery;
import com.msb.crm.utils.AssertUtil;
import com.msb.crm.utils.PhoneUtil;
import com.msb.crm.vo.SaleChance;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;


@Service
public class SaleChanceService extends BaseService<SaleChance,Integer> {

    @Autowired
    private SaleChanceMapper saleChanceMapper;

    /**
     * 多条件查询结构要按照Layui的指定格式，不然显示不了
     * @param saleChanceQuery
     * @return
     */
    public Map<String,Object> querySaleChanceParams(SaleChanceQuery saleChanceQuery){

        Map<String,Object> map = new HashMap<>();

        //开启分页
        PageHelper.startPage(saleChanceQuery.getPage(), saleChanceQuery.getLimit());

        //得到对应分页的对象
        PageInfo<SaleChance> pageInfo = new PageInfo<>(saleChanceMapper.selectByParams(saleChanceQuery));

        //设置map对象
        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());

        //设置分页好的列表
        map.put("data",pageInfo.getList());

        return map;
    }


    /**
     *
     * @param saleChance
     */
    @Transactional
    public void addSaleChance(SaleChance saleChance){
        /*1、校验参数*/
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());

        /*2、设置相关字段的默认值*/
        //isValid是否有效(0=无效 ，1=有效)
        saleChance.setIsValid(1);
        //createTime创建时间
        saleChance.setCreateDate(new Date());
        //updateTime,默认当前时间
        saleChance.setUpdateDate(new Date());
        //判断是否设置了指派人
        if (StringUtils.isBlank(saleChance.getAssignMan())){
            //如果为空，则表示未设置指派人
            saleChance.setState(StateStatus.UNSTATE.getType());
            //指派时间  设置未null
            saleChance.setAssignTime(null);
            //开发状态
            saleChance.setDevResult(DevResult.UNDEV.getStatus());
        }else {
            //如果不为空，表示设置了指派人
            saleChance.setState(StateStatus.STATED.getType());
            saleChance.setAssignTime(new Date());
            saleChance.setDevResult(DevResult.DEVING.getStatus());
        }


        /*3、执行添加操作，判断受影响的行数*/
        AssertUtil.isTrue(saleChanceMapper.insertSelective(saleChance)!=1,"添加营销机会失败！");
    }


    /**
     * 参数校验
     * @param customerName
     * @param linkMan
     * @param linkPhone
     */
    private void checkSaleChanceParams(String customerName, String linkMan, String linkPhone) {
        //customerName 客户名称  非空
        AssertUtil.isTrue(StringUtils.isBlank(customerName),"客户名称不能为空！");
        //linkMan联系人  非空
        AssertUtil.isTrue(StringUtils.isBlank(linkMan),"联系人不能为空！");
        //手机号  非空
        AssertUtil.isTrue(StringUtils.isBlank(linkPhone),"联系号码不能为空！");
        //  手机号码格式正确
        AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone),"联系号码格式不正确！");
    }


    public void updateSaleChance(SaleChance saleChance){
        /*1、参数校验*/
        //营销机会ID  非空  数据库中的对应记录存在
        AssertUtil.isTrue(null == saleChance.getId(),"待更新记录不存在！");
        //通过主键查询对象
        SaleChance temp = saleChanceMapper.selectByPrimaryKey(saleChance.getId());
        //判断数据库中对应的记录存在
        AssertUtil.isTrue(temp == null,"待更新记录不存在！");
        //参数校验
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());


        /*2、设置相关参数的默认值*/
        saleChance.setUpdateDate(new Date());
        //assignMan指派人
        //判断原始数据是否存在
        if (StringUtils.isBlank(temp.getAssignMan())){//不存在
           //判断修改后的值是否存在
            if (!StringUtils.isBlank(saleChance.getAssignMan()))
            {
                //修改前为空，修改后有值
                //指派时间为当前时间
                saleChance.setAssignTime(new Date());
                //分配状态 1=已分配
                saleChance.setState(StateStatus.STATED.getType());
                //开发状态 1=开发中
                saleChance.setDevResult(DevResult.DEVING.getStatus());
            }
        }else {
            //存在
            if (StringUtils.isBlank(saleChance.getAssignMan())){
                //修改前有值，修改后为空
                saleChance.setAssignTime(null);
                saleChance.setState(StateStatus.UNSTATE.getType());
                saleChance.setDevResult(DevResult.UNDEV.getStatus());
            }else {
                //修改前后都有值
                //判断是否为同一个值
                if (!saleChance.getAssignMan().equals(temp.getAssignMan())){
                    //更新指派时间
                    saleChance.setAssignTime(new Date());
                }else
                {
                    //设置指派时间为修改前的时间
                    saleChance.setAssignTime(temp.getAssignTime());
                }
            }
        }
        /*3、执行更新操作，判断受影响的行数*/
        AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance) != 1,"更新营销机会失败！");
    }


    /**
     * 删除营销机会
     * @param ids
     */
    public void deleteSaleChance(Integer[] ids){
        //判断ID是否为空
        AssertUtil.isTrue(null== ids || ids.length < 1,"待删除记录不存在！");
        //执行删除操作，判断受影响的行数
        AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids) != ids.length,"营销机会数据删除失败！");
    }


    /**
     * 更新营销机会的开发状态
     * @param id
     * @param devResult
     */

    @Transactional
    public void updateSaleChanceDevResult(Integer id, Integer devResult) {
        AssertUtil.isTrue(null == id ,"待更新记录不存在!");
        SaleChance saleChance = saleChanceMapper.selectByPrimaryKey(id);
        AssertUtil.isTrue(null == devResult ,"待更新记录不存在!");

        //设置开发状态
        saleChance.setDevResult(devResult);

        //执行更新操纵，判断受影响的行数
        AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance) != 1,"开发状态更新失败！");
    }
}
